﻿// 检查是否是VBA代码
function isVBACode(code) {
    // 去除注释
    code = code.replace(/'.*$/gm, '');

    // 匹配 Sub 或 Function 块
    const pattern = /^\s*(Sub|Function)\b[\s\S]*?(End (Sub|Function))\s*$/i;
    return pattern.test(code);
}


// 从网页节点提取代码
function extractCode(preElement) {
    // 先尝试查找带有行号表格结构的代码
    const codeCells = preElement.querySelectorAll('.hljs-ln-code');
    if (codeCells.length > 0) {
        const codeLines = [];
        codeCells.forEach(cell => {
            codeLines.push(cell.textContent.trim());
        });
        return codeLines.join('\n');
    }

    // 如果没有找到行号表格结构，直接获取 <pre> 标签内的文本
    const codeElement = preElement.querySelector('code');
    return codeElement ? codeElement.textContent : preElement.textContent;
}

// 创建执行按钮（通用）
function createExecuteButton(preElement, codeType) {
    const btn = document.createElement('button');
    btn.className = `vba-code-${codeType === 'vba' ? 'run' : 'execute'}-button`;
    btn.textContent = codeType === 'vba' ? '▶️ 运行' : '▶️ 执行';
    btn.style.color = '#756FE9';
    btn.style.marginRight = '5px';

    btn.addEventListener('click', () => {
        const code = extractCode(preElement);

        // 检查代码类型
        const isValid = codeType === 'vba' ? isVBACode(code) : isJSACode(code);
        if (isValid) {
            // 将代码进行 URL 编码
            const encodedCode = encodeURIComponent(code);

            // 将代码发送给 C# 后端
            if (window.chrome && window.chrome.webview) {
                window.chrome.webview.postMessage({
                    type: codeType === 'vba' ? 'runVBA' : 'executeJSA',
                    code: encodedCode // 传输编码后的代码
                });
            } else {
                console.log('C# 后端未连接');
            }
        } else {
            alert(`这不是有效的 ${codeType === 'vba' ? 'VBA' : 'JSA'} 代码`);
        }
    });
    return btn;
}

// 创建收藏按钮
function createFavoriteButton(preElement, codeType) {
    const btn = document.createElement('button');
    btn.className = `vba-code-${codeType}-favorite-button`;
    btn.textContent = '❤️ 收藏';
    btn.style.color = '#756FE9';

    btn.addEventListener('click', () => {
        const code = extractCode(preElement);

        // 检查代码类型
        const isValid = codeType === 'vba' ? isVBACode(code) : isJSACode(code);
        if (isValid) {
            // 将代码发送给 C# 后端
            if (window.chrome && window.chrome.webview) {
                window.chrome.webview.postMessage({
                    type: `${codeType === 'vba' ? 'favoriteVBA' : 'favoriteJSA'}`,
                    code: code
                });
            } else {
                console.log('C# 后端未连接');
            }
        } else {
            alert(`这不是有效的 ${codeType === 'vba' ? 'VBA' : 'JSA'} 代码`);
        }
    });
    return btn;
}

// 检查是否已经存在按钮
function hasButtons(container) {
    return (
        container.querySelector('.vba-code-run-button') ||
        container.querySelector('.vba-code-execute-button') ||
        container.querySelector('.vba-code-vba-favorite-button') ||
        container.querySelector('.vba-code-jsa-favorite-button')
    );
}

// 主函数
function init() {
    document.querySelectorAll('pre').forEach(preElement => {
        const code = extractCode(preElement);

        // 检查代码类型
        let codeType = null;
        if (isVBACode(code)) {
            codeType = 'vba';
        } else if (isJSACode(code)) {
            codeType = 'jsa';
        }

        if (codeType) {
            // 创建一个容器来放置按钮
            const container = document.createElement('div');
            container.style.display = 'flex';
            container.style.justifyContent = 'flex-end';
            container.style.marginTop = '10px';

            // 检查是否已经存在按钮
            if (hasButtons(preElement.parentElement)) {
                return; // 如果已经存在按钮，跳过
            }

            const executeBtn = createExecuteButton(preElement, codeType);
            const favoriteBtn = createFavoriteButton(preElement, codeType);

            container.appendChild(executeBtn);
            container.appendChild(favoriteBtn);

            // 查找复制按钮
            const copyButton = preElement.parentElement.querySelector('.copy');
            if (copyButton) {
                // 将按钮容器插入到复制按钮所在的容器中
                copyButton.parentNode.insertBefore(container, copyButton.nextSibling);
            } else {
                // 如果没有复制按钮，将按钮容器插入到代码块的下方
                preElement.parentElement.appendChild(container);
            }
        }
    });
}

// 使用 MutationObserver 监听动态加载的内容
const observer = new MutationObserver((mutationsList) => {
    for (const mutation of mutationsList) {
        if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
            // 延迟执行 init，避免频繁调用
            setTimeout(init, 100);
            break;
        }
    }
});

// 观察整个文档的变化
observer.observe(document.body, {
    childList: true,
    subtree: true
});

// 初始执行
init();